package com.sun.jdk.date.jdk8after;

import java.time.*;
import java.util.Set;

public class Java8TimeClassMethodDemo1 {

    /**
     * 通过now()方法创建如下对象的示例
     * Instant
     * LocalDate
     * LocalTime
     * LocalDateTime
     * ZoneDateTime
     */
    private static void test1() {
        Instant instantNow = Instant.now();

        LocalDate localDateNow = LocalDate.now();

        LocalTime localTimeNow = LocalTime.now();

        LocalDateTime localDateTimeNow = LocalDateTime.now();

        ZonedDateTime zonedDateTimeNow = ZonedDateTime.now();

        System.out.println("Instant:"+instantNow);
        System.out.println("LocalDate:"+localDateNow);
        System.out.println("LocalTime:"+localTimeNow);
        System.out.println("LocalDateTime:"+localDateTimeNow);
        System.out.println("ZonedDateTime:"+zonedDateTimeNow+",时区信息："+zonedDateTimeNow.getZone());
    }

    /**
     * 通过now()方法创建如下对象的示例
     * <p>Year</p>
     * <p>YearMonth</p>
     * <p>MonthDay</p>
     */
    private static void test2(){
        Year year = Year.now();
        YearMonth yearMonth = YearMonth.now();
        MonthDay monthDay = MonthDay.now();

        System.out.println("year:"+year);
        System.out.println("yearMonth:"+yearMonth);
        System.out.println("monthDay:"+monthDay);
    }

    /**
     * 通过of方法创建指定的时间
     */
    private static void test3(){
        LocalDate localDate = LocalDate.of(2018, Month.AUGUST, 18);
        System.out.println(localDate);

        LocalTime localTime = LocalTime.of(20, 12);
        System.out.println("localTime = " + localTime);

        LocalDateTime localDateTime = LocalDateTime.of(2022, 7, 23, 18, 2, 23);
        System.out.println("localDateTime = " + localDateTime);
        LocalDateTime localDateTime1 = LocalDateTime.of(2022, Month.JULY, 23, 18, 2, 23);
        System.out.println("localDateTime1 = " + localDateTime1);
        LocalDateTime localDateTime2 = LocalDateTime.of(localDate, localTime);
        System.out.println("localDateTime2 = " + localDateTime2);

    }

    /**
     * 时区信息
     */
    private static void test4(){
        ZoneId systemDefaultZone = ZoneId.systemDefault();
        System.out.println("systemDefaultZone = " + systemDefaultZone);
        System.out.println("***");
        // 获取所有的时区信息
        Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
        System.out.println("有多少个时区?"+availableZoneIds.size());
        availableZoneIds.forEach(System.out::println);
    }

    /**
     * 我们可以通过给 LocalDateTimem添加时区信息来查看到不同时区的时间，
     * 比如说 LocalDateTime中当前封装的是上海时间，那么想知道此时此刻，纽约的时间是多少，就可以将纽约的时区Id添加进去，就可以查看到了
     *
     * 我想验证的几点内容：
     * 1. 我给定一个时间点，不加时区信息，那么这个时间点默认就是我所在地区的默认时区吗？ 是的
     * 2. 我有一个日期时间字符串，如何把这个日期时间字符串转换成我想要的LocalDateTime对象呢
     */
    private static void test5(){

        // 以下两种都是创建默认时区(也就是本地电脑系统中的默认时区)的LocalDateTime
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println("localDateTime = " + localDateTime);
        LocalDateTime localDateTime1 = LocalDateTime.now(ZoneId.systemDefault());
        System.out.println("localDateTime1 = " + localDateTime1);


        // 但是如果我想创建一个其他时区的LocalDateTime对象怎么做到呢？意思就是说,虽然我本地电脑系统上的默认时区是Asia/Shanghai,但是
        // 我就是想知道Asia/Tokyo在此刻的LocalDateTime所对应的时间日期是多少，那么就可以用如下方法创建
        LocalDateTime localDateTimeShanghai = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
        System.out.println("上海当前时间 ： " + localDateTimeShanghai);

        LocalDateTime localDateTimeTokyo = LocalDateTime.now(ZoneId.of("Asia/Tokyo"));
        System.out.println("东京当前时间是： = " + localDateTimeTokyo);

        // 现在的需求是，我已经通过默认时区创建了一个LocalDateTime对象，但是我想知道当前我创建的这个LocalDateTime对象在其他时区的
        // 时间该怎么做到呢？ 可以为已经存在的LocalDateTime对象添加时区信息来查看不同时区的时间。
        // 比如说LocalDateTime中当前封装的是上海时间，那么想知道此时此刻，纽约的时间是多少，就可以将纽约的时区Id添加进去，就可以查看到了

        // 把一个本地默认本地时区的时间，添加上时区信息
        ZonedDateTime zonedDateTimeDefault = localDateTime.atZone(ZoneId.systemDefault());
        System.out.println("当前默认时区的时间是：" + zonedDateTimeDefault);

        // 在得到ZonedDateTime对象的基础上，想要更改时区，查看当前时区的时间，在另一个时区对应的日期时间是多少
        ZonedDateTime zonedDateTimeTokyo = zonedDateTimeDefault.withZoneSameInstant(ZoneId.of("Asia/Tokyo"));
        System.out.println("当前默认时区的时间是："+zonedDateTimeDefault+"，对应的东京时间是：" + zonedDateTimeTokyo);

    }

    public static void main(String[] args) {
         test1();
         System.out.println("------");
        // test2();
        // System.out.println("------");
        // test3();
        // System.out.println("------");
        // test4();
        // System.out.println("------");
        test5();
    }
}
